package Arrays;

/**
 * 作者:hfj
 * 功能:2.两数相加
 * 日期: 2024/6/29 17:51
 */
public class AddTwoNumbers {
    // 递归方法，用于将两个链表表示的数字相加
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 递归出口：如果两个链表都为空，说明已经处理完毕，返回null
        if (l1 == null && l2 == null) {
            return null;
        }

        // 如果l1为空，则创建一个值为0的新节点，保证两个链表长度一致
        if (l1 == null) {
            l1 = new ListNode(0);
        }
        // 如果l2为空，则创建一个值为0的新节点，保证两个链表长度一致
        if (l2 == null) {
            l2 = new ListNode(0);
        }

        // 计算当前两个节点的和
        int sum = l1.val + l2.val;

        // 检查是否需要进位
        if (sum > 9) {
            // 如果需要进位，并且l1的下一个节点为空，则创建一个值为0的新节点用于存储进位
            if (l1.next == null) {
                l1.next = new ListNode(0);
            }
            // 增加l1的下一个节点的值（即处理进位）
            l1.next.val++;
            // 递归处理剩余的节点
            return new ListNode(sum % 10, addTwoNumbers(l1.next, l2.next));
        }

        // 不需要进位，直接递归处理剩余的节点
        return new ListNode(sum, addTwoNumbers(l1.next, l2.next));
    }

    // 链表节点的辅助类
    static class ListNode {
        int val; // 节点的值
        ListNode next; // 指向下一个节点的指针

        // 无参构造函数
        ListNode() {}

        // 带一个参数的构造函数，用于设置节点的值
        ListNode(int val) { this.val = val; }

        // 带两个参数的构造函数，用于设置节点的值和指向下一个节点的指针
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
}


